/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package miselania.tiposgenericos;
import java.util.ArrayList;
import java.util.Iterator;
/**
 *
 * @author Cinthya
 */
public class ListaSimple {
    NodosLista PrimerNodo;
	NodosLista UltimoNodo;
	String Nombre;
	
	//Constructor
	public boolean VaciaLista(){
		return PrimerNodo ==null;
	}
	
	//Contructor
	public ListaSimple(String s){
		Nombre=s;
		PrimerNodo=UltimoNodo=null;
	}
		
	//Constructor
	public ListaSimple(){
		this ("Lista");
	}
	
	//Imprime el contenido de la lista
	public void Imprimir(){
		if (VaciaLista()){
			System.out.println("Vacia" + Nombre);
		}
		else{
			System.out.print("La "+Nombre + " es: ");
			NodosLista Actual=PrimerNodo;
			while(Actual != null){
				System.out.print(Actual.datos.toString()+" ");
				Actual=Actual.siguiente;
			}
			System.out.println();
			System.out.println();
		}
	}

	//Inserta un elemento al frente de la lista
	void InsertaInicio(Object ElemInser){
		if(VaciaLista())
		PrimerNodo=UltimoNodo=new NodosLista(ElemInser);
		else
		PrimerNodo=new NodosLista(ElemInser, PrimerNodo);
	}
	
	//Inserta al final de la lista
	public void InsertaFinal(Object ElemInser){
		if(VaciaLista()){
		PrimerNodo= UltimoNodo = new NodosLista (ElemInser);
	    }
		else{
		UltimoNodo=UltimoNodo.siguiente=new NodosLista(ElemInser);
	    }
	}
	
	//Inserta elemento en posicion dada
	public void InsertaMedio(Object ElemInser,int Posicion){
		if(VaciaLista())
		PrimerNodo=UltimoNodo=new NodosLista (ElemInser);
		else{
			if(Posicion<=1){
				NodosLista Nuevo=new NodosLista(ElemInser);
				Nuevo.siguiente=PrimerNodo;
				PrimerNodo=Nuevo;
			}
			else{
				NodosLista Aux=PrimerNodo;
				int i=2;
				while((i != Posicion) & (Aux.siguiente != null)){
					i++;
					Aux=Aux.siguiente;
				}
				NodosLista Nuevo=new NodosLista(ElemInser);
				Nuevo.siguiente=Aux.siguiente;
				Aux.siguiente=Nuevo;
			}
		}
	}
	
	//Elimina al Inicio
	public void EliminaInicio(){
		if(VaciaLista())
		System.out.println("No hay elementos");
		else
		if(PrimerNodo.equals(UltimoNodo))
		PrimerNodo=UltimoNodo=null;
		else
		PrimerNodo=PrimerNodo.siguiente;
	}
	
	//Retorna si un elemento es miembro
	public boolean Miembro(Object ele){
		boolean enc=false;
		NodosLista aux=PrimerNodo;
		while((aux != null) && (enc==false)){
			if(ele.equals(aux.datos)){
				enc=true;
			}
			else{
				aux=aux.siguiente;
			}
		}
		return enc;
	}
	
	//Elimina un elemento
	public void EliminaEle(Object ele){
		NodosLista aux=PrimerNodo;
		NodosLista p=PrimerNodo;
		NodosLista ant=null;
		boolean enc=false;
		
		while((aux != null) && (enc==false)){
			if(ele.equals(aux.datos)) enc=true;
			else{
				ant=aux;
				aux=aux.siguiente;
			}
		}
		
		if(enc==true){
			if (aux.equals(PrimerNodo)){
				PrimerNodo=aux.siguiente;
			}
			else{
				if (aux.equals(UltimoNodo)){
					UltimoNodo=ant;
					ant.siguiente=null;
				}
				else{
					NodosLista i=aux.siguiente;
					aux=ant;
					aux.siguiente=i;
					PrimerNodo=p;
				}
			}
		}
	}
	
	//Obtiene el menor de los elementos	
	public Object Menor(){
		NodosLista aux=PrimerNodo,p=PrimerNodo;
		Object men1,sig1;
		men1=aux.datos;
		int men,sig;
		men=Integer.parseInt(aux.datos.toString());
		while(aux != null){
			sig1=aux.datos;
			sig=Integer.parseInt(aux.datos.toString());
			if(men>sig){ 
				men=sig;
				men1=sig1;
			}
			aux=aux.siguiente;
		}
		PrimerNodo=p;
		return men1;
	}
	
	//Ordena la lista
	public void Ordenar(){
		NodosLista aux=PrimerNodo;
		ListaSimple j=new ListaSimple();
		Object m;
		while (!VaciaLista()){
			m=Menor();
			j.InsertaFinal(m);
			EliminaEle(m);
		}
		j.Imprimir();
	}
	
	//Invierte la lista
	public void Invertir(){
		NodosLista sig = PrimerNodo;
	  	NodosLista anterior = null;
	  	while(!(VaciaLista())){
	    	sig = PrimerNodo.siguiente;
	    	PrimerNodo.siguiente = anterior;
	    	anterior = PrimerNodo;
	    	PrimerNodo = sig;
	  	}
	  	PrimerNodo= anterior;
	}
        public void ListIterator()
        {
            if (VaciaLista())
            {
                System.out.println("Vacia" + Nombre);
            }
            else
            {
                ArrayList<Object> Lista= new ArrayList<Object>();
                NodosLista Actual=PrimerNodo;
                while(Actual != null)
                {
                    Lista.add(Actual.datos);
                    Actual=Actual.siguiente;
                }
                for (Iterator<Object> it = Lista.iterator(); it.hasNext();) {
                    Object object = it.next();
                    System.out.println(object.toString());
                    
                }
                        
                        
            }
        }
}
